﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Bpms.Data;
using Bpms.Entity;
using Bpms.Log;
using Bpms.Cache;

namespace Bpms.Bll
{
    public class Role
    {
        #region Member

        /// <summary>
        /// 数据库改动事件委托
        /// </summary>
        public delegate void DBChangedEventHandler();

        /// <summary>
        /// 日志事件委托
        /// </summary>
        public delegate void LogEventHandler();

        /// <summary>
        /// 数据库改动事件
        /// </summary>
        public static event DBChangedEventHandler DBChanged;

        /// <summary>
        /// 写日志事件
        /// </summary>
        public static event LogEventHandler WriteLog;

        #region Private
        private static IDataProvider provider = DatabaseProvider.GetInstance();

        /// <summary>
        /// 数据改动事件处理函数
        /// </summary>
        static void OnDBChanged()
        {
            if (DBChanged != null)
            {
                DBChanged();
            }
        }

        /// <summary>
        /// 写日志处理函数
        /// </summary>
        static void OnWriteLog()
        {
            if (WriteLog != null)
            {
                WriteLog();
            }
        }
        #endregion

        #endregion

        /// <summary>
        /// 添加角色
        /// </summary>
        /// <param name="role">角色实体对象</param>
        /// <returns>-1：存在相同的记录（角色名称相同），0：添加失败，1：添加成功</returns>
        public static int InsertRole(RoleInfo role)
        {
            if (provider.RoleExists(role, OperateType.Insert))
            {   // 判断是否存在相同角色名称的记录
                return -1;
            }

            if (provider.InsertRole(role))
            {
                OnDBChanged();
                OnWriteLog();
                return 1;
            }

            return 0;
        }

        /// <summary>
        /// 修改角色
        /// </summary>
        /// <param name="role">角色实体对象</param>
        /// <returns>-1：存在相同的记录（角色名称相同），0：添加失败，1：添加成功</returns>
        public static int UpdateRole(RoleInfo role)
        {
            if (provider.RoleExists(role, OperateType.Update))
            {   // 判断是否存在相同角色名称的记录
                return -1;
            }

            if (provider.UpdateRole(role))
            {
                OnDBChanged();
                OnWriteLog();
                return 1;
            }

            return 0;
        }

        /// <summary>
        /// 删除角色
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <returns>删除是否成功（true：删除成功，false：删除失败）</returns>
        public static bool DeleteRole(int roleId)
        {
            return provider.DeleteRole(roleId);
        }

        /// <summary>
        /// 判断角色名称是否存在
        /// </summary>
        /// <param name="role">角色对象</param>
        /// <param name="type">操作类别（添加或修改）</param>
        /// <returns>角色名称是否存在（true：已存在，false：不存在）</returns>
        public static bool RoleExists(RoleInfo role, OperateType type)
        {
            return provider.RoleExists(role, type);
        }

        /// <summary>
        /// 得到角色对象
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <returns>角色对象</returns>
        public static RoleInfo GetRole(int roleId)
        {
            return provider.GetRole(roleId);
        }

        /// <summary>
        /// 得到角色列表
        /// </summary>
        /// <param name="pageId">当前页ID</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="condition">提取的条件</param>
        /// <returns>角色列表</returns>
        public static IList<RoleInfo> GetRoles(int pageId, int pageSize, string condition)
        {
            return provider.GetRoles(pageId, pageSize, condition);
        }

        /// <summary>
        /// 得到角色列表
        /// </summary>
        /// <param name="condition">提取的条件</param>
        /// <returns>角色列表</returns>
        public static IList<RoleInfo> GetRoles(string condition)
        {
            return provider.GetRoles(condition);
        }

        /// <summary>
        /// 得到角色列表
        /// </summary>
        /// <returns>角色列表</returns>
        public static IList<RoleInfo> GetRoles()
        {
            return provider.GetRoles("");
        }

        /// <summary>
        /// 根据角色ID得到角色名称
        /// </summary>
        /// <param name="roleId">角色ID</param>
        /// <returns>角色名称</returns>
        public static string GetRoleName(int roleId)
        {
            return provider.GetRoleName(roleId);
        }
    }
}
